package org.japo.java.swing.igu;

import org.japo.java.swing.listeners.GEC;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import org.japo.java.swing.beans.PanelFondo;

public class IGU extends JFrame {

    // Componentes del IGU
    private JLabel lblPrueba;
    private JSlider sldTalla;
    private JSpinner spnTalla;

    // Valores predeterminados de fuente - Label
    private final String FAM_LBL = "Calibri";
    private final int EST_LBL = Font.PLAIN;
    private final int TAM_LBL = 40;

    // Valores predeterminados de fuente - Componente
    private final String FAM_COM = "Calibri";
    private final int EST_COM = Font.BOLD;
    private final int TAM_COM = 20;

    // Recurso con la imagen de forndo del panel
    private final String RES_PKG = "/org/japo/java/resources/img";
    private final String RES_IMG = "fondo.jpg";
    private final String RECURSO = RES_PKG + "/" + RES_IMG;

    // Texto de prueba
    private final String TEXTO = "Érase una vez Java";

    // Configuración JSlider
    private final int TALLA_MINIMA = 0;
    private final int TALLA_MAXIMA = 100;
    private final int PASO_MENOR = 5;
    private final int PASO_MAYOR = 25;

    public IGU() {
        iniciarComponentes();
    }

    private void iniciarComponentes() {
        // Panel principal
        JPanel pnlPrincipal = new JPanel();
        pnlPrincipal.setLayout(new GridLayout(2, 1));

        // Fuentes
        Font fntLbl = new Font(FAM_LBL, EST_LBL, TAM_LBL);
        Font fntCom = new Font(FAM_COM, EST_COM, TAM_COM);

        // Borde de etiqueta
        Border brdEtiqueta = new BevelBorder(BevelBorder.LOWERED);

        // Etiqueta de prueba
        lblPrueba = new JLabel();
        lblPrueba.setFont(fntLbl);
        lblPrueba.setText(TEXTO);
        lblPrueba.setHorizontalAlignment(JLabel.CENTER);
        lblPrueba.setOpaque(true);
        lblPrueba.setBackground(Color.WHITE);
        lblPrueba.setBorder(brdEtiqueta);
        pnlPrincipal.add(lblPrueba);

        // Imagen de fondo
        URL urlImagen = getClass().getResource(RECURSO);
        Image i = new ImageIcon(urlImagen).getImage();

        // Panel de control
        JPanel pnlControl = new PanelFondo(i);
        FlowLayout fl = new FlowLayout();
        fl.setHgap(50);
        fl.setVgap(20);
        pnlControl.setLayout(fl);
        pnlPrincipal.add(pnlControl);

        // Gestor de eventos de cambio
        GEC gec = new GEC(this);

        // Deslizador selector de talla
        sldTalla = new JSlider();
        sldTalla.setMinimum(TALLA_MINIMA);
        sldTalla.setMaximum(TALLA_MAXIMA);
        sldTalla.setValue(TAM_LBL);
        sldTalla.setFont(fntCom);
        sldTalla.setPaintLabels(true);
        sldTalla.setPaintTicks(true);
        sldTalla.setMinorTickSpacing(PASO_MENOR);
        sldTalla.setMajorTickSpacing(PASO_MAYOR);
        sldTalla.addChangeListener(gec);
        sldTalla.setOpaque(false);
        pnlControl.add(sldTalla);

        // Modelo de cambiador
        SpinnerNumberModel modeloSpinner = new SpinnerNumberModel();
        modeloSpinner.setMinimum(TALLA_MINIMA);
        modeloSpinner.setMaximum(TALLA_MAXIMA);
        modeloSpinner.setValue(TAM_LBL);

        // Cambiador selector de talla
        spnTalla = new JSpinner();
        spnTalla.setModel(modeloSpinner);
        spnTalla.setFont(fntCom);
        spnTalla.addChangeListener(gec);
        pnlControl.add(spnTalla);

        // Ventana principal
        setTitle("Selección de tamaño");
        setContentPane(pnlPrincipal);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setSize(400, 200);
        setLocationRelativeTo(null);
    }

    public void procesarTalla(Object o) {
        int talla;

        if (o.equals(sldTalla)) {
            talla = sldTalla.getValue();
            spnTalla.setValue(talla);
        } else {
            Object objValor = spnTalla.getValue();
            talla = (Integer) objValor;
            sldTalla.setValue(talla);
        }

        // Actualiza fuente
        Font f = new Font(FAM_LBL, EST_LBL, talla);

        // Aplica fuente
        lblPrueba.setFont(f);
    }
}
